/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.core;

import com.entidades.Aparelho;
import com.entidades.Pacote;
import com.entidades.dao.DaoBasico;
import com.entidades.enumerandos.OperadorasEnum;
import com.entidades.enumerandos.StatusAparelhoEnum;
import com.entidades.enumerandos.TipoAparelhoEnum;
import excecoes.NenhumAparelhoDisponivelException;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.transaction.UserTransaction;

/**
 *
 * @author @
 */
public class EleitorDestino {

    /**
     * Elege um aparelho ativo e na melhor estratégia de acordo com o pacote
     * @param em
     * @param p
     * @return Aparelho
     */
    public static synchronized Aparelho elege(Pacote p, EntityManager em, OperadorasEnum operadora, TipoAparelhoEnum tipo, UserTransaction utx) throws NenhumAparelhoDisponivelException {
        Query query = null;
        if (operadora != null && !operadora.equals(OperadorasEnum.INDIFERENTE)) {
            query = em.createQuery("Select a from Aparelho a where a.status='CONECTADO' " +
                    "AND a.tipo = :tipo " +
                    " and a.operadora =:operadora " +
                    " and a.dataHoraUltimoEnvio = " +
                    "(select min(a2.dataHoraUltimoEnvio) from Aparelho a2 where a2.status='CONECTADO')");
            query.setParameter("tipo", tipo);
            query.setParameter("operadora",operadora);
        } else {
            //Acesso a tabela aparelho tem que ser sicronizado??? TODO testar
            query = em.createQuery("Select a from Aparelho a where a.status='CONECTADO' " +
                    "AND a.tipo = :tipo " +
                    "and a.dataHoraUltimoEnvio = " +
                    "(select min(a2.dataHoraUltimoEnvio) from Aparelho a2 where a2.status='CONECTADO')");
            query.setParameter("tipo", tipo);
        }
        /*Query query = em.createQuery("Select a from Aparelho a where a.id=12");*/


        Aparelho a = null;
        List<Aparelho> listAparelho = new ArrayList<Aparelho>();

        listAparelho = query.getResultList();
        if (listAparelho != null && listAparelho.size() > 0) {
            a = listAparelho.get(0);
        } else {
            System.out.println("Nenhum aparelho Encontrado!!!");
            throw new NenhumAparelhoDisponivelException();
        }

        a.setStatus(StatusAparelhoEnum.EM_USO);
        DaoBasico.merge(a, em, utx);
        return a;

    }
}
